#include "CMenu.h"

#include <QApplication>
#include <QDebug>
#include <QEvent>
#include <QGraphicsDropShadowEffect>
#include <QPainter>
#include <QProxyStyle>
#include <QStyleOptionMenuItem>

#ifdef Q_OS_WINDOWS
#include <dwmapi.h>
#include <windows.h>
#include <windowsx.h>
#endif

// class CMenuProxyStyle : public QProxyStyle {
// public:
//    using QProxyStyle::QProxyStyle;
//    void drawControl(ControlElement element, const QStyleOption *opt, QPainter *p,
//                     const QWidget *w) const override {
//        if (element == QStyle::CE_MenuItem) {
//            if (const QStyleOptionMenuItem *o =
//                    qstyleoption_cast<const QStyleOptionMenuItem *>(opt)) {
//                QStyleOptionMenuItem menuitem = *o;
//                QString text = o->text;
//                menuitem.text = "";
//                QProxyStyle::drawControl(element, &menuitem, p, w); // Draw other elements
//                if (!text.isEmpty()) {
//                    QStringList list = text.split("\t");
//                    int baseFlags = Qt::AlignVCenter | Qt::TextDontClip | Qt::TextSingleLine;
//                    if (list.size() > 0) {
//                        p->drawText(menuitem.rect, baseFlags | Qt::AlignLeft, list.at(0));
//                    }
//                    if (list.size() > 1) {
//                        p->drawText(menuitem.rect, baseFlags | Qt::AlignRight, list.at(1));
//                    }
//                }
//                return;
//            }
//        }
//        QProxyStyle::drawControl(element, opt, p, w);
//    }
//};

CMenu::CMenu(QWidget *parent) : QMenu(parent) {
    init();
}

CMenu::CMenu(const QString &title, QWidget *parent) : QMenu(title, parent) {
    init();
}

CMenu::~CMenu() {
}

void CMenu::init() {
    // Prepare
#ifdef Q_OS_WINDOWS
    m_hasInitWindow = false;
#endif
    //    setStyle(new CMenuProxyStyle(style()));

    setFont(qApp->font());
}


void CMenu::winIdChangeEvent(QEvent *event) {
    //    if (!m_hasInitWindow) {
    //        HWND hwnd = HWND(winId());
    //        DWORD style = ::GetClassLong(hwnd, GCL_STYLE);
    //        style &= ~CS_DROPSHADOW;
    //        ::SetClassLong(hwnd, GCL_STYLE, style);

    //        DWMNCRENDERINGPOLICY val = DWMNCRP_ENABLED;
    //        ::DwmSetWindowAttribute(hwnd, DWMWA_NCRENDERING_POLICY, &val,
    //        sizeof(DWMNCRENDERINGPOLICY));

    //        MARGINS m = {5, 5, 5, 5};
    //        HRESULT hr = ::DwmExtendFrameIntoClientArea(hwnd, &m);
    //        if (SUCCEEDED(hr)) {
    //            // do more things
    //        }

    //        m_hasInitWindow = true;
    //    }
}

bool CMenu::nativeEvent(const QByteArray &eventType, void *message, long *result) {
    return QMenu::nativeEvent(eventType, message, result);
}

void CMenu::paintEvent(QPaintEvent *event) {
    return QMenu::paintEvent(event);
}

bool CMenu::event(QEvent *event) {
    if (event->type() == QEvent::WinIdChange) {
        winIdChangeEvent(event);
        return true;
    } else if (event->type() == QEvent::StyleChange) {
    }
    return QWidget::event(event);
}
